/*
 * xlogdefs.h
 *
 * Postgres 写前日志管理器记录指针和
 * 时间线编号定义
 *
 * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * src/include/access/xlogdefs.h
 */
#ifndef XLOG_DEFS_H
#define XLOG_DEFS_H

#include <fcntl.h>				/* 需要open()标志 */

/*
 * 指向XLOG中的某个位置的指针。这些指针宽64位，
 * 因为我们不希望它们会溢出。
 */
typedef uint64 XLogRecPtr;

/*
 * 零用于表示无效指针。引导跳过第一个可能的
 * WAL段，在WAL段大小处初始化第一个WAL页面，因此没有XLOG
 * 记录可以从零开始。
 */
#define InvalidXLogRecPtr	0
#define XLogRecPtrIsInvalid(r)	((r) == InvalidXLogRecPtr)

/*
 * "假" LSNs使用的第一个LSN。
 *
 * 小于此的值可以用于特殊的每个AM目的。
 */
#define FirstNormalUnloggedLSN	((XLogRecPtr) 1000)

/*
 * 方便的宏，用于以传统格式打印XLogRecPtr，例如，
 *
 * printf("%X/%X", LSN_FORMAT_ARGS(lsn));
 */
#define LSN_FORMAT_ARGS(lsn) (AssertVariableIsOfTypeMacro((lsn), XLogRecPtr), (uint32) ((lsn) >> 32)), ((uint32) (lsn))

/*
 * XLogSegNo - 物理日志文件序列号。
 */
typedef uint64 XLogSegNo;

/*
 * TimeLineID (TLI) - 标识不同的数据库历史，以防止在恢复
 * 数据库安装的先前状态后产生混淆。TLI在数据库的正常停止/重启中不会改变
 * （包括崩溃恢复情况）；但我们必须在进行
 * 恢复到先前状态（即时间点恢复）后分配新的TLI。这使得
 * 我们生成的新WAL日志文件序列可以与先前实例中生成的序列区分开来。
 */
typedef uint32 TimeLineID;

/*
 * 复制起源id - 将其放在此文件中，以避免在许多与xlog相关的地方
 * 包含origin.h。
 */
typedef uint16 RepOriginId;

/*
 * 这部分黑客尝试确定当前平台上可用的文件同步方法，并选择一个合适的
 * 默认方法。我们假设fsync()总是可用，并且
 * 配置确定fdatasync()是否可用。
 */
#if defined(O_SYNC)
#define OPEN_SYNC_FLAG		O_SYNC
#elif defined(O_FSYNC)
#define OPEN_SYNC_FLAG		O_FSYNC
#endif

#if defined(O_DSYNC)
#if defined(OPEN_SYNC_FLAG)
/* O_DSYNC是区分的？ */
#if O_DSYNC != OPEN_SYNC_FLAG
#define OPEN_DATASYNC_FLAG		O_DSYNC
#endif
#else							/* !defined(OPEN_SYNC_FLAG) */
/* Win32仅具有O_DSYNC */
#define OPEN_DATASYNC_FLAG		O_DSYNC
#endif
#endif

#if defined(PLATFORM_DEFAULT_SYNC_METHOD)
#define DEFAULT_SYNC_METHOD		PLATFORM_DEFAULT_SYNC_METHOD
#elif defined(OPEN_DATASYNC_FLAG)
#define DEFAULT_SYNC_METHOD		SYNC_METHOD_OPEN_DSYNC
#elif defined(HAVE_FDATASYNC)
#define DEFAULT_SYNC_METHOD		SYNC_METHOD_FDATASYNC
#else
#define DEFAULT_SYNC_METHOD		SYNC_METHOD_FSYNC
#endif

#endif							/* XLOG_DEFS_H */
